﻿// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using Admin.NET.Plugin.Easy.Wms.Enum;
using Admin.NET.Plugin.Easy.Wms.IServices.IArea;
using Admin.NET.Plugin.Easy.Wms.Services.Area.DTO;
using Admin.NET.Plugin.Easy.Wms.Util;
using Furion.FriendlyException;
using Mapster;

namespace Admin.NET.Plugin.Easy.Wms.Services.Area;

/// <summary>
/// 区域管理服务
/// </summary>
public class AreaServices : BaseService.BaseServices<Easy_Wms_AreaEntity>, IAreaServices
{
    private readonly SqlSugarRepository<Easy_Wms_AreaEntity> _area = App.GetService<SqlSugarRepository<Easy_Wms_AreaEntity>>();

    /// <summary>
    /// 添加区域业务逻辑
    /// </summary>
    /// <param name="input">输入参数</param>
    /// <returns></returns>
    public async Task Add(AreaAddInput input)
    {
        input.Area_Num = input.Area_Num.GenerateIfNullOrEmpty(() => GenerateNum.GeneratedNumber("AREA"));
        var entity = input.Adapt<Easy_Wms_AreaEntity>();
        await _area.InsertAsync(entity);
    }

    /// <summary>
    /// 删除区域
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    /// TODO：没有进行删除校验
    public async Task Delete(AreaDeleteInput input)
    {
        // 判断能否删除，如果区域里面有库位，则不能删除
        var entity = await _area.GetFirstAsync(x => x.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
        await _area.FakeDeleteAsync(entity);
    }

    /// <summary>
    /// 分页查询区域列表
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public Task<SqlSugarPagedList<AreaOutPut>> PageAsync(AreaPageInput input)
    {
        var data = _area.AsQueryable()
              .WhereIF(!string.IsNullOrEmpty(input.Area_Num), x => x.Area_Num.Contains(input.Area_Num))
              .WhereIF(!string.IsNullOrEmpty(input.Area_Name), x => x.Area_Name.Contains(input.Area_Name))
              .WhereIF(!string.IsNullOrEmpty(input.Area_Type), x => x.Area_Type.Contains(input.Area_Type))
              .WhereIF(input.Id > 0, x => x.Id == input.Id)
              .Select<AreaOutPut>();

        return data.ToPagedListAsync(input.Page, input.PageSize);
    }

    /// <summary>
    /// 修改区域业务逻辑
    /// </summary>
    /// <param name="input">输入参数</param>
    /// <returns></returns>
    public async Task Update(AreaUpdateInput input)
    {
        // 查询上层是否存在仓库
        // 有存在则不能修改
        if (input.WareHouse_ID != null)
        {
            throw Oops.Oh(Easy_Wms_ErrorCodeEnum.WMSER001);
        }
        var model = input.Adapt<Easy_Wms_AreaEntity>();
        model.UpdateTime = DateTime.Now;
        await _area.AsUpdateable(model).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
    }
}
